﻿/**************************************************************
 *
 * 唯一标识：8b3e481a-aec6-448e-84dc-3a2e298df0a6
 * 命名空间：Sgr.UPMS.Application.Commands.Roles
 * 创建时间：2023/8/27 17:45:51
 * 机器名称：DESKTOP-S0D075D
 * 创建者：antho
 * 电子邮箱：fengqinhua2016@163.com
 * 描述：删除角色命令处理器
 *
 **************************************************************/

using MediatR;
using Sgr.Application.Commands;
using Sgr.UPMS.Domain.Roles;
using Sgr.UPMS.Domain.Users;
using System.Threading;
using System.Threading.Tasks;

namespace Sgr.UPMS.Application.Commands.Roles
{
    /// <summary>
    /// 删除角色命令处理器
    /// </summary>
    public class DeleteRoleCommandHandle : IRequestHandler<DeleteRoleCommand, CommandResult<bool>>
    {
        private readonly IRoleRepository _roleRepository;
        private readonly IUserManage _userManage;

        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="roleRepository">角色仓储</param>
        /// <param name="userManage">用户管理器</param>
        public DeleteRoleCommandHandle(IRoleRepository roleRepository,
             IUserManage userManage)
        {
            _roleRepository = roleRepository;
            _userManage = userManage;
        }

        /// <summary>
        /// 处理删除角色命令
        /// </summary>
        /// <param name="request">命令请求</param>
        /// <param name="cancellationToken">取消令牌</param>
        /// <returns>处理结果</returns>
        public async Task<CommandResult<bool>> Handle(DeleteRoleCommand request, CancellationToken cancellationToken)
        {
            // 查找角色实体
            var role = await _roleRepository.GetAsync(request.RoleId, cancellationToken);

            // 如果找不到角色，返回NotFound结果
            if (role == null)
                return CommandResult.NotFound<bool>("未找到指定的角色");

            // 确保角色没有被用户使用
            bool isRoleInUse = await _userManage.HasUserUseRoleAsync(request.RoleId, cancellationToken);
            if (isRoleInUse)
                return CommandResult.Conflict<bool>($"角色 [{role.RoleName}] 有用户在使用，不允许删除");

            // 标记角色为待删除
            role.MarkForDeletion();

            // 删除角色
            await _roleRepository.DeleteAsync(role, cancellationToken);

            // 返回成功结果
            return CommandResult.Success(true, "角色删除成功");
        }
    }
}